/*
async/await语法糖就是使用Generator函数+自动执行器来运作的

Generator是ES6标准引入的新的数据类型。Generator可以理解为一个状态机，内部封装了很多状态，同时返回一个迭代器Iterator对象。可以通过这个迭代器遍历相关的值及状态。
Generator的显著特点是可以多次返回，每次的返回值作为迭代器的一部分保存下来，可以被我们显式调用。

流程：递归调用Generator的next方法,每次都取的是一个promise

 */

// 定义了一个promise，用来模拟异步请求，作用是传入参数++
function getNum(num){
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(num+1)
        }, 1000)
    })
}

//自动执行器，如果一个Generator函数没有执行完，则递归调用
function asyncFun(func){
    var gen = func();

    function next(data){
        // 执行Generator的next方法 取到下一个yield表达式
        var result = gen.next(data);
        if (result.done) return result.value;
        // 如果一个Generator函数没有执行完，则递归调用。这里result.value能够使用then方法是因为func函数传进来，里面的getNum是返回Promise的
        result.value.then((data)=>{
            next(data);
        });
    }

    next();
}

// 所需要执行的Generator函数，内部的数据在执行完成一步的promise之后，再调用下一步
var func = function* (){
    var f1 = yield getNum(1);
    var f2 = yield getNum(f1);
    var f3 = yield getNum(f2);

    console.log(f2) ;
    console.log(f3) ;
};
asyncFun(func);
